Skip to content

Conversation

@esteve
Copy link
Contributor

@esteve esteve commented Dec 19, 2024

This PR moves the rosidl_generator_rs folder from ros2-rust @ 31e4563e2b5a19f62f4841138927a215978bf01c

esteve and others added 30 commits February 2, 2018 22:30
* nested messages working

* fix array support

* add rcl_sys

* add author & fix compilation order

* readme

* format

* fix clippy warnings

* delete patch

* remove leftover build.rs

* fix authors

* add qos support

* add spin & change handle handling

* clippy

* edit readme

* Update README.md

* fix message generation issue

* remove messages

* fix fixed size nested array issue

* delete unused files

* reset authors

* remove rcl_sys

* remove remaining authors & revert readme

* fix quickstart

* fix fixed size array warning

* add rosidl_defaults to repos

* fix warnings with array generation

* register the 'rosidl_generator_rs'

* revert message generation to its initial state

* add rcl build dependency to rclrs

* move spin and spin_once from Node to rclrs

* move publisher sleep at the end of the loop

* re-add msg to rosidl_generator_rs

* add TODO for publisher and subscription lifetime
* fix warnings

* update README for Ubuntu 18.04

* Build on Dashing

* Build on Eloquent

* Build on Foxy

* clean in IDL generator

* Use foxy in pipeline

Co-authored-by: deb0ch <tom@blackfoot.io>
Co-authored-by: deb0ch <thomas.de.beauchene@gmail.com>
* Experimental change to build system.
Allows IDE to parse dependencies.
Distro A, OPSEC #4584. You may have additional rights; please see https://rosmilitary.org/faq/?category=ros-2-license

Signed-off-by: Jacob Hassold <jhassold@dcscorp.com>

* Remove commented code
Distro A, OPSEC #4584. You may have additional rights; please see https://rosmilitary.org/faq/?category=ros-2-license

Signed-off-by: Jacob Hassold <jhassold@dcscorp.com>

* Refactoring to workspace layout. Does not compile.
Distro A, OPSEC #4584. You may have additional rights; please see https://rosmilitary.org/faq/?category=ros-2-license

Signed-off-by: Jacob Hassold <jhassold@dcscorp.com>

* Revert change to workspace, general CMake tweaks
Distro A, OPSEC #4584. You may have additional rights; please see https://rosmilitary.org/faq/?category=ros-2-license

Signed-off-by: Jacob Hassold <jhassold@dcscorp.com>

* Initial re-make of build system
Distro A, OPSEC #4584. You may have additional rights; please see https://rosmilitary.org/faq/?category=ros-2-license

Signed-off-by: Jacob Hassold <jhassold@dcscorp.com>

* Fixing warnings within rosidl_generator
Distro A, OPSEC #4584. You may have additional rights; please see https://rosmilitary.org/faq/?category=ros-2-license

Signed-off-by: Jacob Hassold <jhassold@dcscorp.com>

* Make sure cargo builds within the correct directory
Distro A, OPSEC #4584. You may have additional rights; please see https://rosmilitary.org/faq/?category=ros-2-license

Signed-off-by: Jacob Hassold <jhassold@dcscorp.com>

* Add in checks for ROS 2 version to change
the compilation syntax
Distro A, OPSEC #4584. You may have additional rights; please see https://rosmilitary.org/faq/?category=ros-2-license

Signed-off-by: Jacob Hassold <jhassold@dcscorp.com>

* Properly query environment variable
Distro A, OPSEC #4584. You may have additional rights; please see https://rosmilitary.org/faq/?category=ros-2-license

Signed-off-by: Jacob Hassold <jhassold@dcscorp.com>

* Only bind rcl, rmw, and rcutils
Distro A, OPSEC #4584. You may have additional rights; please see https://rosmilitary.org/faq/?category=ros-2-license

Signed-off-by: Jacob Hassold <jhassold@dcscorp.com>

* Re-write to move most of `rclrs_common` to `rclrs`
Distro A, OPSEC #4584. You may have additional rights; please see https://rosmilitary.org/faq/?category=ros-2-license

Signed-off-by: Jacob Hassold <jhassold@dcscorp.com>

* Updating/fixing package XML to comply with
format 3 schema
Distro A, OPSEC #4584. You may have additional rights; please see https://rosmilitary.org/faq/?category=ros-2-license

Signed-off-by: Jacob Hassold <jhassold@dcscorp.com>

* Missed a schema update
Distro A, OPSEC #4584. You may have additional rights; please see https://rosmilitary.org/faq/?category=ros-2-license

Signed-off-by: Jacob Hassold <jhassold@dcscorp.com>

* Missed another schema...
Distro A, OPSEC #4584. You may have additional rights; please see https://rosmilitary.org/faq/?category=ros-2-license

Signed-off-by: Jacob Hassold <jhassold@dcscorp.com>

* Remove manual crate paths in toml files
Distro A, OPSEC #4584. You may have additional rights; please see https://rosmilitary.org/faq/?category=ros-2-license

Signed-off-by: Jacob Hassold <jhassold@dcscorp.com>
* Use the ament_cargo build type

The rclrs_crate_config_generator is superseded by colcon-ros-cargo.
The ament_cmake_export_crates mechanism is subsumed by creating entries in the ament index directly in the rosidl_generator_rs and cargo-ament-build.

* Install colcon-cargo and colcon-ros-cargo

* Force running pip3 as root

* Install cargo-ament-build

* Removed no longer needed dependencies

* Disable Rolling job

* Update README

* Update rust.yml

* Update README.md

Co-authored-by: Esteve Fernandez <esteve@apache.org>
Previously, only messages consisting of basic types and strings were supported. Now, all message types will work, including those that have fields of nested types, bounded types, or arrays.

Changes:
- The "rsext" library is deleted
- Unused messages in "rosidl_generator_rs" are deleted
- There is a new package, "rosidl_runtime_rs", see below
- The RMW-compatible messages from C, which do not require an extra conversion step, are exposed in addition to the "idiomatic" messages
- Publisher and subscription are changed to work with both idiomatic and rmw types, through the unifying `Message` trait

On `rosidl_runtime_rs`: This package is the successor of `rclrs_msg_utilities` package, but doesn't have much in common with it anymore.
It provides common types and functionality for messages. The `String` and `Sequence` types and their variants in that package essentially wrap C types from the `rosidl_runtime_c` package and C messages generated by the "rosidl_generator_c" package.
A number of functions and traits are implemented on these types, so that they feel as ergonomic as possible, for instance, a `seq!` macro for creating a sequence. There is also some documentation and doctests.

The memory for the (non-pretty) message types is managed by the C allocator.

Not yet implemented:
- long double
- constants
- Services/clients
- @verbatim comments
- ndarray for sequences/arrays of numeric types
- implementing `Eq`, `Ord` and `Hash` when a message contains no floats
… (#138)

* Generate Cargo.toml of message crate with an EmPy template, not CMake

* Add comment
* feat: obtain interface version from cmake variable

Signed-off-by: Daisuke Nishimatsu <border_goldenmarket@yahoo.co.jp>

* refactor: append package version into generator arguments file

Signed-off-by: Daisuke Nishimatsu <border_goldenmarket@yahoo.co.jp>
* Added support for clients and services
Paths on Windows can contain colons. With rsplit, the drive letter was
grouped with the package name.
Message packages containing unbounded sequences of WStrings, like test_msgs, would not compile because of this.
This will produce:

```
impl VariousTypes {
    /// binary, hexadecimal and octal constants are also possible
    pub const TWO_PLUS_TWO: i8 = 5;
    /// Only unbounded strings are possible
    pub const PASSWORD: &'static str = "hunter2";
    /// As determined by Edward J. Goodwin
    pub const PI: f32 = 3.0;
 }
 ```
* Swapped usage of rosidl_cmake over to the new rosidl_pycommon.

As of [rosidl 3.3.0](ros2/rosidl@9348ce9), the rosidl_cmake Python module was moved to a new rosidl_pycommon package and the Python module in rosidl_cmake was deprecated.

* Support builds from older ROS 2 distros.

* Fixed build for rolling

* Added `test_depend` conditional inclusion as well.

* Swap to a more elegant check

* PR Feedback

---------

Co-authored-by: Sam Privett <sam@privett.dev>
Signed-off-by: Esteve Fernandez <esteve@apache.org>
This reverts commit a64e397990319db39caf79ef7863b21fb2c828ea.
* Add wchar support and .idl example

* Undo automatic IDE formatting noise

* Added back unused imports to see if this fixes the build

* More attempts to fix the weird build failure

* Removed the linter tests for auto-generated message source files in `rclrs_example_msgs`. Re-applied some changes removed when root causing.

---------

Co-authored-by: Sam Privett <sam@privett.dev>
Signed-off-by: Michael X. Grey <mxgrey@intrinsic.ai>
Signed-off-by: Michael X. Grey <mxgrey@intrinsic.ai>
nwn and others added 2 commits October 26, 2024 14:11
* Added action template

* Added action generation

* Added basic create_action_client function

* dded action generation

* checkin

* Fix missing exported pre_field_serde field

* Removed extra code

* Sketch out action server construction and destruction

This follows generally the same pattern as the service server. It
required adding a typesupport function to the Action trait and pulling
in some more rcl_action bindings.

* Fix action typesupport function

* Add ActionImpl trait with internal messages and services

This is incomplete, since the service types aren't yet being generated.

* Split srv.rs.em into idiomatic and rmw template files

This results in the exact same file being produced for services,
except for some whitespace changes. However, it enables actions to
invoke the respective service template for its generation, similar to
how the it works for services and their underlying messages.

* Generate underlying service definitions for actions

Not tested

* Add runtime trait to get the UUID from a goal request

C++ uses duck typing for this, knowing that for any `Action`, the type
`Action::Impl::SendGoalService::Request` will always have a `goal_id`
field of type `unique_identifier_msgs::msg::UUID` without having to
prove this to the compiler. Rust's generics are more strict, requiring
that this be proven using type bounds.

The `Request` type is also action-specific as it contains a `goal` field
containing the `Goal` message type of the action. We therefore cannot
enforce that all `Request`s are a specific type in `rclrs`.

This seems most easily represented using associated type bounds on the
`SendGoalService` associated type within `ActionImpl`. To avoid
introducing to `rosidl_runtime_rs` a circular dependency on message
packages like `unique_identifier_msgs`, the `ExtractUuid` trait only
operates on a byte array rather than a more nicely typed `UUID` message
type.

I'll likely revisit this as we introduce more similar bounds on the
generated types.

* Integrate RMW message methods into ActionImpl

Rather than having a bunch of standalone traits implementing various
message functions like `ExtractUuid` and `SetAccepted`, with the
trait bounds on each associated type in `ActionImpl`, we'll instead add
these functions directly to the `ActionImpl` trait. This is simpler on
both the rosidl_runtime_rs and the rclrs side.

* Add rosidl_runtime_rs::ActionImpl::create_feedback_message()

Adds a trait method to create a feedback message given the goal ID and
the user-facing feedback message type. Depending on how many times we do
this, it may end up valuable to define a GoalUuid type in
rosidl_runtime_rs itself. We wouldn't be able to utilize the
`RCL_ACTION_UUID_SIZE` constant imported from `rcl_action`, but this is
pretty much guaranteed to be 16 forever.

Defining this method signature also required inverting the super-trait
relationship between Action and ActionImpl. Now ActionImpl is the
sub-trait as this gives it access to all of Action's associated types.
Action doesn't need to care about anything from ActionImpl (hopefully).

* Add GetResultService methods to ActionImpl

* Implement ActionImpl trait methods in generator

These still don't build without errors, but it's close.

* Replace set_result_response_status with create_result_response

rclrs needs to be able to generically construct result responses,
including the user-defined result field.

* Implement client-side trait methods for action messages

This adds methods to ActionImpl for creating and accessing
action-specific message types. These are needed by the rclrs
ActionClient to generically read and write RMW messages.

Due to issues with qualified paths in certain places
(rust-lang/rust#86935), the generator now
refers directly to its service and message types rather than going
through associated types of the various traits. This also makes the
generated code a little easier to read, with the trait method signatures
from rosidl_runtime_rs still enforcing type-safety.

* Format the rosidl_runtime_rs::ActionImpl trait

* Wrap longs lines in rosidl_generator_rs action.rs

This at least makes the template easier to read, but also helps with the
generated code. In general, the generated code could actually fit on one
line for the function signatures, but it's not a big deal to split it
across multiple.

* Use idiomatic message types in Action trait

This is user-facing and so should use the friendly message types.

* Cleanup ActionImpl using type aliases

Signed-off-by: Michael X. Grey <grey@openrobotics.org>

* Formatting

* Switch from std::os::raw::c_void to std::ffi::c_void

While these are aliases of each other, we might as well use the more
appropriate std::ffi version, as requested by reviewers.

* Clean up rosidl_generator_rs's cmake files

Some of the variables are present but no longer used. Others were not
updated with the action changes.

* Add a short doc page on the message generation pipeline

This should help newcomers orient themselves around the rosidl_*_rs
packages.

---------

Signed-off-by: Michael X. Grey <grey@openrobotics.org>
Co-authored-by: Esteve Fernandez <esteve@apache.org>
Co-authored-by: Michael X. Grey <grey@openrobotics.org>
* Update rclrs vendor_interfaces.py script

This updates the vendor_interfaces.py script to also vendor in the
action_msgs and unique_identifier_msgs packages. The script is modified
to always use a list of package names rather than hard-coding the
package names everywhere.

* Silence certain clippy lints on generated code

In case a user enforces clippy linting on these generated packages,
silence expected warnings. This is already the case in rclrs, but should
be applied directly to the generated packages for the sake of downstream
users.

The `clippy::derive_partial_eq_without_eq` lint was already being
disabled for the packages vendored by rclrs, but is now moved to the
rosidl_generator_rs template instead. This is necessary since we always
derive the PartialEq trait, but can't necessary derive Eq, and so don't.

The `clippy::upper_case_acronyms` is new and was added to account for
message type names being upper-case acrynyms, like
unique_identifier_msgs::msg::UUID.

* Update vendored message packages

This updates the message packages vendored under the rclrs `vendor`
module. The vendor_interfaces.py script was used for reproducibility.

The existing packages – rcl_interfaces, rosgraph_msgs, and
builtin_interfaces – are only modified in that they now use the
std::ffi::c_void naming for c_void instead of the std::os::raw::c_void
alias and disable certain clippy lints.

The action_msgs and unique_identifier_msgs packages are newly added to
enable adding action support to rclrs. action_msgs is needed for
interaction with action goal info and statuses, and has a dependency on
unique_identifier_msgs.
@esteve esteve requested a review from a team December 19, 2024 10:19
@esteve esteve force-pushed the add-rosidl_generator_rs branch 2 times, most recently from 4906190 to 9ce13e4 Compare December 19, 2024 10:25
@esteve
Copy link
Contributor Author

esteve commented Dec 19, 2024

@ros2-rust/team I've used the following to move the rosidl_generator_rs folder:

cd ros2_rust
git checkout main
git subtree split -P rosidl_generator_rs -b rosidl_generator_rs-only
cd ..
cd rosidl_rust
checkout -b add-rosidl_generator_rs
git subtree add -P rosidl_generator_rs ../ros2_rust/ HEAD

But the history is not linear. If I rebase this branch on top of main via git rebase origin/main, I get the correct commit history, however all files are moved to the top level folder. Do you know how to rebase the history and at the same time keep all changes in the rosidl_generator_rs folder?

@esteve esteve force-pushed the add-rosidl_generator_rs branch from 9ce13e4 to 363164c Compare December 19, 2024 10:43
@esteve
Copy link
Contributor Author

esteve commented Dec 19, 2024

I've ended up using https://github.com/newren/git-filter-repo to move rosidl_generator_rs and then a rebase, now commit history is correct and all the files are in the rosidl_generatory_rs folder

@esteve
Copy link
Contributor Author

esteve commented Jan 28, 2025

@mxgrey @jhdcs @maspe36 any feedback? I'd like to merge this before the big upcoming changes

Copy link
Contributor

@maspe36 maspe36 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One downside is it seems like the commits all have the same timestamp now? Not a huge problem since the order and count is preserved. Just a minor annoyance

@esteve esteve force-pushed the add-rosidl_generator_rs branch from 363164c to 0c683f5 Compare February 5, 2025 13:02
@esteve
Copy link
Contributor Author

esteve commented Feb 5, 2025

@maspe36 I've fixed the timestamps, but like with ros2-rust/rosidl_runtime_rs#2 (comment) I don't think that GitHub will preserve the correct ones when merging this PR, I'll do a manual push on main instead of merging via the PR interface.

@esteve esteve merged commit 0c683f5 into ros2-rust:main Feb 5, 2025
@esteve esteve deleted the add-rosidl_generator_rs branch February 5, 2025 13:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.